home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / viewers / prev / prev.lha / util.c < prev   
C/C++ Source or Header  |  1991-03-20  |  2KB  |  137 lines

  1. #include <stdio.h>
  2. #include <math.h>
  3. #include "art.h"
  4. #include "macro.h"
  5. #include "gram.h"
  6.  
  7. extern attr    *astackp, astack[];
  8. extern mats    *mstackp, mstack[];
  9.  
  10. extern matrix    trans;
  11. extern vector    org;
  12. extern int    linecount;
  13.  
  14. /*
  15.  * utility routines for adjusting transformations and other
  16.  * object attributes.
  17.  */
  18.  
  19. /*
  20.  * art_rotate
  21.  *
  22.  *     adjust the transformation matrix for a rotate
  23.  */
  24. art_rotate(ang, axis)
  25.     float    ang;
  26.     char    axis;
  27. {
  28.     matrix    mat, tmp;
  29.     float    sinval, cosval;
  30.  
  31.     mident4(mat);
  32.     sinval = sin(-ang * M_PI / 180.0);
  33.     cosval = cos(-ang * M_PI / 180.0);
  34.  
  35.     switch (axis) {
  36.     case 'x':
  37.         mat[1][1] = cosval;
  38.         mat[1][2] = -sinval;
  39.         mat[2][2] = cosval;
  40.         mat[2][1] = sinval;
  41.         break;
  42.     case 'y':
  43.         mat[0][0] = cosval;
  44.         mat[0][2] = sinval;
  45.         mat[2][0] = -sinval;
  46.         mat[2][2] = cosval;
  47.         break;
  48.     case 'z':
  49.         mat[0][0] = cosval;
  50.         mat[0][1] = -sinval;
  51.         mat[1][0] = sinval;
  52.         mat[1][1] = cosval;
  53.         break;
  54.     default:
  55.         fatal("art: bad axis name in rotate.\n");
  56.     }
  57.  
  58.     mcpy4(tmp, mstackp->vm);
  59.     mmult4(mstackp->vm, tmp, mat);
  60.  
  61.     mstackp->vmused = TRUE;
  62. }
  63.  
  64. /*
  65.  * art_translate
  66.  *
  67.  *    translate
  68.  */
  69. art_translate(x, y, z)
  70.     float    x, y, z;
  71. {
  72.     matrix    mat, tmp;
  73.  
  74.     mident4(mat);
  75.  
  76.     mat[3][0] = x;
  77.     mat[3][1] = y;
  78.     mat[3][2] = z;
  79.  
  80.     mcpy4(tmp, mstackp->vm);
  81.     mmult4(mstackp->vm, tmp, mat);
  82.  
  83.     mstackp->vmused = TRUE;
  84. }
  85.  
  86. /*
  87.  * art_scale
  88.  *
  89.  *    scale routine
  90.  */
  91. art_scale(x, y, z)
  92.     float    x, y, z;
  93. {
  94.     matrix    mat, tmp;
  95.  
  96.     mident4(mat);
  97.  
  98.     mat[0][0] *= x;
  99.     mat[1][1] *= y;
  100.     mat[2][2] *= z;
  101.  
  102.     mcpy4(tmp, mstackp->vm);
  103.     mmult4(mstackp->vm, tmp, mat);
  104.  
  105.     mstackp->vmused = TRUE;
  106. }
  107.  
  108. /*
  109.  * calctransforms
  110.  *
  111.  *    calculate the current ray2obj and obj2ray transformation
  112.  * matrices.
  113.  */
  114. calctransforms(msp)
  115.     mats    *msp;
  116. {
  117.     matrix        tmp, tmp1, tmp2;
  118.     mats        *mp;
  119.  
  120.     if (msp->vmused) {
  121.         if (msp != mstack) {
  122.             mp = msp;
  123.             mcpy4(tmp1, mp->vm);
  124.             while (mp != mstack) {
  125.                 mmult4(tmp2, tmp1, (mp - 1)->vm, tmp1);
  126.                 mcpy4(tmp1, tmp2);
  127.                 mp--;
  128.             }
  129.         } else
  130.             mcpy4(tmp1, msp->vm);
  131.         mcpy4(msp->obj2ray, tmp1);
  132.     } else
  133.         return;
  134.  
  135.     msp->vmused = FALSE;
  136. }
  137.